import {
  IsInt,
  IsString,
  IsOptional,
  IsNotEmpty,
  IsPositive,
  MaxLength,
  Min,
  Max,
  IsEnum,
  ValidateNested,
  MinLength,
} from 'class-validator';
import { Transform } from 'class-transformer';
import { Type } from 'class-transformer';

/**
 * 添加收藏DTO
 */
export class AddFavoriteDto {
  @IsInt({ message: '小说ID必须是整数' })
  @IsPositive({ message: '小说ID必须是正整数' })
  novelId: number;

  @IsOptional()
  @Transform(({ value }) => parseInt(value))
  @IsInt({ message: '书架ID必须是整数' })
  @IsPositive({ message: '书架ID必须是正整数' })
  bookshelfId?: number;
}

/**
 * 获取收藏列表DTO
 */
export class GetFavoritesDto {
  @IsOptional()
  @Transform(({ value }) => parseInt(value))
  @IsInt({ message: '页码必须是整数' })
  @Min(1, { message: '页码不能小于1' })
  page?: number = 1;

  @IsOptional()
  @Transform(({ value }) => parseInt(value))
  @IsInt({ message: '每页数量必须是整数' })
  @Min(1, { message: '每页数量不能小于1' })
  @Max(100, { message: '每页数量不能超过100' })
  limit?: number = 10;

  @IsOptional()
  @Transform(({ value }) => parseInt(value))
  @IsInt({ message: '书架ID必须是整数' })
  @IsPositive({ message: '书架ID必须是正整数' })
  bookshelfId?: number;

  @IsOptional()
  @IsEnum(['createdAt', 'updatedAt', 'novel.title', 'novel.readCount'], {
    message: '排序字段无效',
  })
  sortBy?: string = 'createdAt';

  @IsOptional()
  @IsEnum(['asc', 'desc'], { message: '排序方向只能是asc或desc' })
  sortOrder?: 'asc' | 'desc' = 'desc';
}

/**
 * 添加阅读历史DTO
 */
export class AddReadingHistoryDto {
  @IsInt({ message: '小说ID必须是整数' })
  @IsPositive({ message: '小说ID必须是正整数' })
  novelId: number;

  @IsOptional()
  @Transform(({ value }) => parseInt(value))
  @IsInt({ message: '章节ID必须是整数' })
  @IsPositive({ message: '章节ID必须是正整数' })
  chapterId?: number;

  @IsOptional()
  @IsString({ message: '阅读进度必须是字符串' })
  @MaxLength(100, { message: '阅读进度不能超过100个字符' })
  readProgress?: string;
}

/**
 * 获取阅读历史DTO
 */
export class GetReadingHistoryDto {
  @IsOptional()
  @Transform(({ value }) => parseInt(value))
  @IsInt({ message: '页码必须是整数' })
  @Min(1, { message: '页码不能小于1' })
  page?: number = 1;

  @IsOptional()
  @Transform(({ value }) => parseInt(value))
  @IsInt({ message: '每页数量必须是整数' })
  @Min(1, { message: '每页数量不能小于1' })
  @Max(100, { message: '每页数量不能超过100' })
  limit?: number = 10;

  @IsOptional()
  @IsString({ message: '分类筛选必须是字符串' })
  categoryCode?: string;

  @IsOptional()
  @IsEnum(['lastReadAt', 'createdAt', 'novel.title'], {
    message: '排序字段无效',
  })
  sortBy?: string = 'lastReadAt';

  @IsOptional()
  @IsEnum(['asc', 'desc'], { message: '排序方向只能是asc或desc' })
  sortOrder?: 'asc' | 'desc' = 'desc';
}

/**
 * 创建评论DTO
 */
export class CreateCommentDto {
  @IsInt({ message: '小说ID必须是整数' })
  @IsPositive({ message: '小说ID必须是正整数' })
  novelId: number;

  @IsOptional()
  @Transform(({ value }) => parseInt(value))
  @IsInt({ message: '章节ID必须是整数' })
  @IsPositive({ message: '章节ID必须是正整数' })
  chapterId?: number;

  @IsNotEmpty({ message: '评论内容不能为空' })
  @IsString({ message: '评论内容必须是字符串' })
  @MinLength(1, { message: '评论内容至少1个字符' })
  @MaxLength(1000, { message: '评论内容不能超过1000个字符' })
  content: string;

  @IsOptional()
  @Transform(({ value }) =>
    value === null || value === undefined ? null : parseInt(value),
  )
  @IsInt({ message: '父评论ID必须是整数' })
  @IsPositive({ message: '父评论ID必须是正整数' })
  parentId?: number | null;
}

/**
 * 获取评论列表DTO
 */
export class GetCommentsDto {
  @Transform(({ value }) => parseInt(value))
  @IsInt({ message: '小说ID必须是整数' })
  @IsPositive({ message: '小说ID必须是正整数' })
  novelId: number;

  @IsOptional()
  @Transform(({ value }) => parseInt(value))
  @IsInt({ message: '章节ID必须是整数' })
  @IsPositive({ message: '章节ID必须是正整数' })
  chapterId?: number;

  @IsOptional()
  @Transform(({ value }) => parseInt(value))
  @IsInt({ message: '页码必须是整数' })
  @Min(1, { message: '页码不能小于1' })
  page?: number = 1;

  @IsOptional()
  @Transform(({ value }) => parseInt(value))
  @IsInt({ message: '每页数量必须是整数' })
  @Min(1, { message: '每页数量不能小于1' })
  @Max(100, { message: '每页数量不能超过100' })
  limit?: number = 10;

  @IsOptional()
  @IsEnum(['createdAt', 'likeCount', 'replyCount'], {
    message: '排序字段无效',
  })
  sortBy?: string = 'createdAt';

  @IsOptional()
  @IsEnum(['asc', 'desc'], { message: '排序方向只能是asc或desc' })
  sortOrder?: 'asc' | 'desc' = 'desc';

  @IsOptional()
  @Transform(({ value }) => value === 'true')
  isHot?: boolean = false;

  @IsOptional()
  @Transform(({ value }) => value === 'true')
  onlyAuthor?: boolean = false;
}

/**
 * 更新评论DTO
 */
export class UpdateCommentDto {
  @IsNotEmpty({ message: '评论内容不能为空' })
  @IsString({ message: '评论内容必须是字符串' })
  @MinLength(1, { message: '评论内容至少1个字符' })
  @MaxLength(1000, { message: '评论内容不能超过1000个字符' })
  content: string;
}

/**
 * 评论回复DTO
 */
export class ReplyCommentDto {
  @IsNotEmpty({ message: '回复内容不能为空' })
  @IsString({ message: '回复内容必须是字符串' })
  @MinLength(1, { message: '回复内容至少1个字符' })
  @MaxLength(1000, { message: '回复内容不能超过1000个字符' })
  content: string;

  @IsOptional()
  @Transform(({ value }) => parseInt(value))
  @IsInt({ message: '章节ID必须是整数' })
  @IsPositive({ message: '章节ID必须是正整数' })
  chapterId?: number;
}

/**
 * 批量操作DTO
 */
export class BatchOperationDto {
  @IsInt({ message: '小说ID必须是整数' })
  @IsPositive({ message: '小说ID必须是正整数' })
  @IsNotEmpty({ message: '小说ID列表不能为空' })
  novelIds: number[];
}

/**
 * 阅读进度更新DTO
 */
export class UpdateProgressDto {
  @IsInt({ message: '小说ID必须是整数' })
  @IsPositive({ message: '小说ID必须是正整数' })
  novelId: number;

  @IsInt({ message: '章节ID必须是整数' })
  @IsPositive({ message: '章节ID必须是正整数' })
  chapterId: number;

  @IsString({ message: '阅读进度必须是字符串' })
  @MaxLength(100, { message: '阅读进度不能超过100个字符' })
  readProgress: string;
}

// ==================== 书架管理DTO ====================

/**
 * 创建书架DTO
 */
export class CreateBookshelfDto {
  @IsNotEmpty({ message: '书架名称不能为空' })
  @IsString({ message: '书架名称必须是字符串' })
  @MinLength(1, { message: '书架名称至少1个字符' })
  @MaxLength(100, { message: '书架名称不能超过100个字符' })
  name: string;

  @IsOptional()
  @IsString({ message: '书架描述必须是字符串' })
  @MaxLength(500, { message: '书架描述不能超过500个字符' })
  description?: string;

  @IsOptional()
  @Transform(({ value }) => parseInt(value))
  @IsInt({ message: '排序必须是整数' })
  @Min(0, { message: '排序不能小于0' })
  sortOrder?: number = 0;
}

/**
 * 更新书架DTO
 */
export class UpdateBookshelfDto {
  @IsOptional()
  @IsString({ message: '书架名称必须是字符串' })
  @MinLength(1, { message: '书架名称至少1个字符' })
  @MaxLength(100, { message: '书架名称不能超过100个字符' })
  name?: string;

  @IsOptional()
  @IsString({ message: '书架描述必须是字符串' })
  @MaxLength(500, { message: '书架描述不能超过500个字符' })
  description?: string;

  @IsOptional()
  @Transform(({ value }) => parseInt(value))
  @IsInt({ message: '排序必须是整数' })
  @Min(0, { message: '排序不能小于0' })
  sortOrder?: number;
}

/**
 * 获取书架列表DTO
 */
export class GetBookshelvesDto {
  @IsOptional()
  @Transform(({ value }) => parseInt(value))
  @IsInt({ message: '页码必须是整数' })
  @Min(1, { message: '页码不能小于1' })
  page?: number = 1;

  @IsOptional()
  @Transform(({ value }) => parseInt(value))
  @IsInt({ message: '每页数量必须是整数' })
  @Min(1, { message: '每页数量不能小于1' })
  @Max(100, { message: '每页数量不能超过100' })
  limit?: number = 50;

  @IsOptional()
  @IsEnum(['name', 'sortOrder', 'createdAt'], {
    message: '排序字段无效',
  })
  sortBy?: string = 'sortOrder';

  @IsOptional()
  @IsEnum(['asc', 'desc'], { message: '排序方向只能是asc或desc' })
  sortOrder?: 'asc' | 'desc' = 'asc';
}

/**
 * 移动收藏到书架DTO
 */
export class MoveToFavoritesDto {
  @IsInt({ message: '书架ID必须是整数' })
  @IsPositive({ message: '书架ID必须是正整数' })
  bookshelfId: number;

  @IsInt({ message: '小说ID必须是整数' })
  @IsPositive({ message: '小说ID必须是正整数' })
  @IsNotEmpty({ message: '小说ID列表不能为空' })
  novelIds: number[];
}
